<?php namespace Home\Controller;

use Hdphp\Controller\Controller;
use Common\Model\Cate;
use Common\Model\Goods;
use Common\Model\GoodsAttr;
use Common\Model\TypeAttr;
class ListController extends Controller{
	
	
	//构造函数
	public function __init(){
		//有个方法可以new类的时候，它会自动帮你在开头打出use 跟路径，不必写use了,不好意思，这是phpstorm的功能
	    
	}
	
	//首页方法,这里很多步骤没有动用递归，所以这里面有很多的情况是针对前提是2维数组的情况
	public function index(){
		$cid=Q('get.cid',0,'intval');
//		p($cid);exit;
		//1、获得面包屑的数组数据
		$cateModel=new Cate;
		$pid=$cateModel->where("cid={$cid}")->pluck('pid');
		View::with('pid',$pid);
		
		$data=$cateModel->get();
		$breadData=$cateModel->getFather($data, $pid);		
		//把自己也压进去
		$breadData[]=$cateModel->where("cid={$cid}")->find();
//		p($breadData);
		View::with('breadData',$breadData);
		
		//2、通过当前分类的cid获得所有的子集的cid
//		2.1获得顶级分类的二级分类
		$topCid=$cid;
		if($pid){
			$topCid=$cateModel->where("cid={$pid}")->pluck('cid');
		}
		View::with('topCid',$topCid);
		
		$secondCate=$cateModel->where("pid={$topCid}")->get();
		View::with('secondCate',$secondCate);
		
//		获得他下属的所有子分类id
		$cids=$cateModel->getSon($cateModel->get(),$cid);
//		把顶级分类也压到cid组成的数组
		$cids[]=$cid;
//		p($cids);
		//3、根据cid获得商品的gid
		$goodsModel=new Goods;
		//这里面写方法的写法，可以用点连接来连接，看样子是php先解析点连接的东西，组合后再体现出来，php先解析，在往数据库拿数据,下面的lists获得的是一维数组
		$gids=$goodsModel->where("shop_category_cid IN(".implode(',',$cids).")")->lists('gid');
		
		if($gids){
//			4、通过gid到goods_attr表查询属性
			$goodsAttrModel=new GoodsAttr;
			//分组groupBy函数，把值一样的只取其中第一个，其他不取
			$goodsAttr=$goodsAttrModel->where("shop_goods_gid IN(".implode(',', $gids).")")->groupBy('gtvalue')->get();
			
			//把相同的taid的属性放在了一起,怎么感觉只是放到一起，而没有前后之分啊？比如，5.5英寸和5.0英寸的顺序问题没解决
//			p($goodsAttr);
			$sameTemp=[];
			$typeAttrModel=new TypeAttr;
			foreach ($goodsAttr as $k => $v) {
				//这样压数据，好吊啊，shop_type_attr_taid值一样的话就压到3级，不一样的话，压给2级数据
				if($typeAttrModel->where("taid={$v['shop_type_attr_taid']} AND class=0")->get()){
					$sameTemp[$v['shop_type_attr_taid']][]=$v;
				}
				
			}
//			p($sameTemp);
			//组合名字和值
			$finalAttr=[];
//			$typeAttrModel=new TypeAttr;
			foreach ($sameTemp as $taid => $v) {
				$finalAttr[]=[
					'name'=>$typeAttrModel->where("taid={$taid}")->pluck('taname'),
					'value'=>$v
				];
			}
			View::with('finalAttr',$finalAttr);	
		//		筛选效果***************
		//		1、地址栏中0_0_0...效果
			$num=count($finalAttr);
//			p($finalAttr);
//			p($num);
			//判断有没有 param值传过来，没有的话，就默认是全部为零的那种形式,array_fill是自动组合出一个索引数组，按照我们给的要求
			$param=isset($_GET['param'])? explode('_', $_GET['param']):array_fill(0, $num, 0);
			View::with('param',$param);
//			p($param);
		//	2、筛选操作，最终获得商品gid
			$finalGids=$this->filter($param,$gids);
//			p($finalGids);

			
//			3、拿到goods中的数据，再显示到页面中
			$goodsData=$goodsModel->where("gid IN(".implode(',', $finalGids).")")->get();

			$sort=isset($_GET['sort'])? explode('_',$_GET['sort']):array_fill(0,4,0);
			View::with('sort',$sort);
//			p($goodsData);
			View::with('goodsData',$goodsData);



		}else{
			//这个是个一定要给值，为空不会报错，为null则会报错
			View::with('finalAttr',[]);
		}
		
		
		
		
		
		
		
	    View::make();
	}
	
	

	
	private function filter($param,$cidGids){
		$goodsAttrModel=new GoodsAttr();
		$gidArr=[];
		foreach ($param as  $gtid) {
			//如果点击的不是“全部”的时候
			if($gtid){
				//查询到商品 属性的名称
				$gtvalue=$goodsAttrModel->where("gtid={$gtid}")->pluck('gtvalue');
				//通过名称查询到gid
				$gidArr[]=$goodsAttrModel->where(['gtvalue'=>$gtvalue])->lists('shop_goods_gid');
			}
		}
		
		//如果$gidArr有值得时候，也就是用户不是全部“全部”的时候
		if($gidArr){
			$gid=$gidArr[0];
			foreach ($gidArr as $v) {
//				取重，取重复的数据，组成数组
				$gid=array_intersect($v,$gid);
			}
			
			//因为$gid其中包含其他分类的gid，确保是当前的分类gid，再次取交集
			$finalGids=array_intersect($gid, $cidGids);
		}else{
//				如果全部是“全部”项目的时候
				$finalGids=$cidGids;
			}
		return $finalGids;
	} 
	
}
